/**
 * @author: TTDB
 * @create: 2025/10/27
 */
public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};
        shellSort(arr);
        System.out.println("希尔排序结果: " + java.util.Arrays.toString(arr));
    }
    /**
     * 希尔排序算法实现
     * 希尔排序是插入排序的一种改进版本，通过将数组分成若干个子序列来进行排序，
     * 逐步缩小子序列间的间隔，最终完成整个数组的排序。
     * 时间复杂度：O(n^1.3) ~ O(n^2)，空间复杂度：O(1)
     * @param arr 待排序的整型数组
     */
    public static void shellSort(int[] arr) {
        int n = arr.length;
        // 希尔排序的间隔序列，从n/2开始，每次减半
        for (int gap = n / 2; gap > 0; gap /= 2) {
            // 对每个间隔为gap的子序列进行插入排序
            for (int i = gap; i < n; i++) {
                int temp = arr[i];
                int j;
                // 在当前子序列中找到temp的正确位置并移动元素
                for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                    arr[j] = arr[j - gap];
                }
                arr[j] = temp;
            }
        }
    }

}
